#ifndef _FNT_MISC_H_
#define _FNT_MISC_H_

#include "utils.h"


#include<QString>
#include<QTextStream>
class QWidget;
class QUrl;

#define forceSegFault() do { auto p=static_cast<int*>(nullptr); *p=0xbad; } while(0)

std::ostream& operator<<(std::ostream& os, const QString& str);

void showMessage(const QString& title, const QString& msg, QWidget* par=nullptr);
void showWarning(const QString& title, const QString& msg, QWidget* par=nullptr);
void showError(const QString& title, const QString& msg, QWidget* par=nullptr);

void openManual(QWidget* par);

QString pathOfSwapFile(const QString& s);
QString pathOfSwapFile(const QUrl& u);
QString pathOfFnt();
QStringList pathOfFntPlugins();

bool readTiff(const QString& fn, uint8_t* buf, int64_t ystride, int64_t zstride);
bool saveTiff(const QString& fn, const uint8_t* buf, int64_t width, int64_t height, int64_t depth, double xres, double yres, double zres);

bool isUrl(const QString& s);

QString getCubeFileName(const QString& pat, int32_t x, int32_t y, int32_t z);

#if QT_VERSION_MINOR<=13
namespace std {
	template<> struct hash<QString> {
		size_t operator()(const QString& s) const { return qHash(s); }
	};
}
#endif
namespace std {
	template<typename T1, typename T2> struct hash<std::pair<T1, T2>> {
		size_t operator()(const std::pair<T1, T2>& s) const { return hash<T1>{}(s.first)^hash<T2>{}(s.second); }
	};
}
bool calcInverse(const std::array<double, 9>& dir, std::array<double, 9>& rdir);
bool checkSingularity(const std::array<double, 9>& mat);

#endif
